import {TypeHelper} from "./typeHelper";
import {curry} from "../pattern/curry";

export class FunctionHelper {
    /**
     * 判断是否为函数
     * @param any data 待判断的数据
     * @returns {boolean}
     */
    static isFunction(data: any): boolean {
        return TypeHelper.isFunction(data);
    }

    /**
     * 获取函数参数个数
     * ────────────────────────
     * 本方法是指该函数有多少个传入的参数，即形参的个数。
     * 形参的数量不包括剩余参数个数，仅包括第一个具有默认值之前的参数个数。
     * @param {Function} fn 待获取参数个数的函数
     * @returns {*} 函数参数个数
     */
    static getArgsCount(fn: Function): number {
        if (FunctionHelper.isFunction(fn)) {
            return fn.length;
        } else {
            return NaN;
        }
    }

    /**
     * @description: 将函数柯里化的工具函数
     * @param {Function} fn 待柯里化的函数
     * @param {...T[]}  args 已经接收的参数列表
     * @return
     * ════════════════════════
     * 参考 https://www.cnblogs.com/bidong/p/15498133.html
     */
    static currying = function <T>(fn: (...args: T[]) => any, ...args: T[]) {
        return curry(fn,...args);
    }

    /**
     * 异步调用函数
     * @param {Function} callback 回调函数(仅支持无参无返回值函数)
     * @param {number} timeout 延迟时间，默认0
     * @constructor
     */
    static AsyncCall(callback: () => void, timeout = 0): void {
        setTimeout(() => {
            if (typeof callback == "function") {
                callback();
            }
        }, timeout);
    }
}
